package com.pangolin.pangolinim.net;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class NetFormat {
    /* 登陆请求 编码 & 解码 */
    public static Netpackage loginEncode(int uid , String passwd , int os) throws JSONException {
        JSONObject jsonData = new JSONObject();
        jsonData.put("uid" , uid);
        jsonData.put("passwd" , passwd);
        jsonData.put("os" , 1);
        String strData = jsonData.toString();

        return new Netpackage(Netpackage.COM_LOGIN , strData);

    }
    public static Map<String , Object> loginDecode(String src) throws JSONException{
        return getMapForJson(src);
    }

    /* 好友列表请求 编码 & 解码 */
    public static Netpackage friendListEndcode(int uid , String key) throws JSONException {
        JSONObject jsonData = new JSONObject();
        jsonData.put("uid" , uid);
        jsonData.put("key" , key);
        String strData = jsonData.toString();

        return new Netpackage(Netpackage.COM_FRIENDLIST , strData);
    }
    public static Map<String , Object> friendListDecode(String src) throws JSONException{
        Map<String , Object> map = new HashMap<>();
        JSONObject jsonData = new JSONObject(src);
        map.put("result" , jsonData.get("result"));
        map.put("msg" , jsonData.get("msg"));
        if((int)jsonData.get("result") == 0){
            map.put("num" , jsonData.get("num"));
            if((int)jsonData.get("num") > 0){
                JSONArray jsonArray = jsonData.getJSONArray("contacts");
                List<Map<String, Object>> contacts = getlistForJsonArray(jsonArray);
                map.put("contacts" , contacts);
            }

        }
        return map;
    }

    /* 登陆请求 编码 & 解码 */
    public static Netpackage findFriendEncode(int from , int to , String key) throws JSONException{
        JSONObject jsonData = new JSONObject();
        jsonData.put("uid" , from);
        jsonData.put("friend_uid" , to);
        jsonData.put("key" , key);
        String strData = jsonData.toString();

        return new Netpackage(Netpackage.COM_FINDFRIEND , strData);
    }
    public static Map<String , Object> findFriendDecode(String src) throws JSONException{
        return getMapForJson(src);
    }

    /* 注册请求 编码 & 解码 */
    public  static Netpackage registerEncode(String username , String passwd) throws  JSONException{
        JSONObject jsonData = new JSONObject();
        jsonData.put("username" , username);
        jsonData.put("passwd" , passwd);
        String strData = jsonData.toString();

        return new Netpackage( Netpackage.COM_REGISTER , strData);
    }
    public static Map<String , Object> registerDecode(String src) throws JSONException {
        return getMapForJson(src);
    }

    /* 添加好友请求 编码 & 解码 */
    public static Netpackage operateFriendEncode(int from , int to , String key , String context , String pubkey) throws JSONException{
        JSONObject jsonData = new JSONObject();
        jsonData.put("from" ,  from);
        jsonData.put("to" , to);
        jsonData.put("key" , key);
        jsonData.put("context" , context);
        jsonData.put("pubkey" , pubkey);
        String strData = jsonData.toString();

        return new Netpackage(Netpackage.COM_OPERATEFRIEND , strData);
    }
    public static Map<String , Object> operateFriendDecode(String src) throws JSONException {
        return getMapForJson(src);
    }

    /* 普通消息 编码 & 解码 */
    public static Netpackage messageEncode(String mid , int type , int from , int to , String key , String context , int time) throws JSONException{
        JSONObject jsonData = new JSONObject();
        jsonData.put("mid" ,  mid);
        jsonData.put("type" ,  type);
        jsonData.put("from" ,  from);
        jsonData.put("to" , to);
        jsonData.put("key" , key);
        jsonData.put("context" , context);
        jsonData.put("time" , time);
        String strData = jsonData.toString();

        return new Netpackage(Netpackage.COM_MESSAGE , strData);
    }
    public static Map<String , Object> messageDecode(String src) throws JSONException {
        return getMapForJson(src);
    }

    /* 同意好友请求 编码 & 解码 */
    public static Netpackage confirmFriendEncode(int from , int to , int result , String key , String pubkey) throws JSONException{
        JSONObject jsonData = new JSONObject();
        jsonData.put("from" , from);
        jsonData.put("to" , to);
        jsonData.put("result" , result);
        jsonData.put("key" , key);
        jsonData.put("pubkey" , pubkey);
        String strData = jsonData.toString();

        return new Netpackage(Netpackage.COM_CONFIRMFRIEND , strData);
    }
    public static Map<String , Object> confirmFriendDecode(String src) throws JSONException{
        return getMapForJson(src);
    }

    /* 退出登陆请求 编码 & 解码 */
    public static Netpackage logoutEncode(int uid , String key) throws JSONException{
        JSONObject jsonData = new JSONObject();
        jsonData.put("uid" , uid);
        jsonData.put("key" , key);
        String strData = jsonData.toString();

        return new Netpackage(Netpackage.COM_LOGOUT , strData);
    }
    public static Map<String , Object> logoutDecode(String src) throws JSONException{
        return getMapForJson(src);
    }

    /* 离线消息请求 编码 & 解码 */
    public static Netpackage offMessageEncode(int uid , String key) throws JSONException{
        JSONObject jsonData = new JSONObject();
        jsonData.put("uid" , uid);
        jsonData.put("key" , key);
        String strData = jsonData.toString();

        return new Netpackage(Netpackage.COM_OFF_MESSAGE , strData);
    }
    public static Map<String , Object> offMessageDecode(String src) throws JSONException{
        return getMapForJson(src);
    }

    /* 删除好友请求 编码 & 解码 */
    public static Netpackage delFriendEncode(int from , int to , String key) throws JSONException{
        JSONObject jsonData = new JSONObject();
        jsonData.put("from" , from);
        jsonData.put("to" , to);
        jsonData.put("key" , key);
        String strData = jsonData.toString();

        return new Netpackage(Netpackage.COM_DELFRIEND , strData);
    }
    public static Map<String , Object> delFriendDecode(String src) throws JSONException{
        return getMapForJson(src);
    }

    /* 修改密码 编码 & 解码 */
    public static Netpackage repassEncode(int uid , String passwd , String key) throws  JSONException{
        JSONObject jsonData = new JSONObject();
        jsonData.put("uid" , uid);
        jsonData.put("key" , key);
        jsonData.put("newpasswd" , passwd);
        String strData = jsonData.toString();

        return new Netpackage(Netpackage.COM_REPASS , strData);
    }
    public static Map<String , Object> repassDecode(String src) throws JSONException{
        return getMapForJson(src);
    }

    /* 修改用户信息 编码 & 解码 */
    public static Netpackage setUserinfoEncode(int uid , String username , String headimg , String key) throws  JSONException{
        JSONObject jsonData = new JSONObject();
        jsonData.put("uid" , uid);
        jsonData.put("key" , key);
        jsonData.put("username" , username);
        jsonData.put("headimg" , headimg);
        String strData = jsonData.toString();

        return new Netpackage(Netpackage.COM_USERINFO , strData);
    }
    public static Map<String , Object> setUserinfoDecode(String src) throws JSONException{
        return getMapForJson(src);
    }


//    public static byte[] heartbeat(int uid , String key) throws JSONException{
//        JSONObject jsonData = new JSONObject();
//        jsonData.put("uid" , uid);
//        jsonData.put("key",key);
//        String strData = jsonData.toString();
//
//        return Netpackage.newPackage(strData , Netpackage.COM_HEARTBEAT);
//    }

    public static String ResMsg(int i){
//        参见服务器端错误信息
//        #define RES_OK          0
//        #define RES_SYS         1
//        #define RES_FORM        2
//        #define RES_LOGIN       3
//        #define RES_KEY         4
//        #define RES_NOTFRIEND   5
//        #define RES_FRIENDED    6
//        #define RES_NOUSER      7
//        #define RES_SAMEID      8
        List<String> msgArray = Arrays.asList("操作成功","服务端系统错误",
                "数据格式错误","登陆失败",
                "访问令牌错误","搜索的用户不存在",
                "该用户已经是您的好友",
                "用户不存在","不能添加自己");
        if(i > msgArray.size() - 1){
            return "未知错误";
        }
        return msgArray.get(i);
    }

    /**
     * Json 转成 Map<>
     * @param jsonStr
     * @return
     */
    public static Map<String, Object> getMapForJson(String jsonStr) throws JSONException{
        Map<String, Object> valueMap = new HashMap<String, Object>();
        JSONObject jsonObject = new JSONObject(jsonStr);
        Iterator<String> keyIter= jsonObject.keys();

        while (keyIter.hasNext()) {
            String key = keyIter.next();
            Object value = jsonObject.get(key);
            valueMap.put(key, value);
        }
        return valueMap;
    }

    /**
     * JSONArray 转成 List<Map<>>
     * @param jsonArray
     * @return
     */
    private static List<Map<String, Object>> getlistForJsonArray(JSONArray jsonArray) throws JSONException{
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        JSONObject jsonObj ;
        for(int i = 0 ; i < jsonArray.length() ; i ++){
            jsonObj = (JSONObject)jsonArray.get(i);
            list.add(getMapForJson(jsonObj.toString()));
        }
        return list;
    }
}
